package com.sx.redis.service;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author AdinZ
 * @date 2020/11/7 14:12
 */
public interface RedisService {
    /**
     * 获取 redis  K/V
     * @return
     */
    <K, V> V get(K key);

    /**
     * 获取 redis Map
     * @return
     */
    <H, HK, HV> HV get(H h, HK hk);

    /**
     * 获取 redis List
     * @return
     */
    <K,V> List<V> get(K k,long start,long end);

    /**
     * redis 查询key值 通配符 *
     * @return
     */
    <K> Set<K> keys(K key);

    /**
     * 添加redis K/V
     */
    <K, V> void set(K k, V v);

    /**
     * 添加 redis K/V 包含过期时间 毫秒
     */
    <K, V> void set(K k, V v, long expire);

    /**
     * 添加redis  Map
     */
    <H, HK, HV> void set(H h, HK hk, HV hv);

    /**
     * 添加redis List
     */
    <K,V> void set(K k,  Collection<V> v);

    /**
     * 删除redis
     * @param k
     * @param <K>
     */
    <K> void delete(K k);

    /**
     * 删除redis Map
     */
    <H, HK> void delete(H h, HK... hk);
    <H, HK, HV> Map<HK, HV> getMap(H h);
    <H, HV> List<HV> getMapValue(H h);
    <H, HK> Set<HK> getMapKeys(H h);
    <K>long increment(K key, long index);
    <K>double increment(K key, double index);
    <H, HK> long increment(H h, HK hk, long index);
    <H, HK> double increment(H h, HK hk, double index);

    /**
     * 锁
     * @param k
     * @param <K>
     * @return false 锁失败,已经存在锁
     */
    <K> boolean lock(K k);

    <K> void unlock(K k);

}
